package initialize

import (
	"a_plus_station/global"
	"a_plus_station/utils"
	"context"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

func InitDB() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	//dsn := "root:123456@tcp(192.168.8.138:3306)/mxshop_user-serve?charset=utf8mb4&parseTime=True&loc=Local"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		global.ServerConfig.MysqlConfigInfo.User,
		global.ServerConfig.MysqlConfigInfo.Password,
		global.ServerConfig.MysqlConfigInfo.Host,
		global.ServerConfig.MysqlConfigInfo.Port,
		global.ServerConfig.MysqlConfigInfo.Name,
	)
	// 设置全局的logger 打印对应的sql
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer（日志输出的目标，前缀和日志包含的内容——译者注）
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound（记录未找到）错误
			Colorful:                  true,        // 是否禁用彩色打印
		},
	)

	var err error
	global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 不加这个会用model的名字加上 s 当做表名字
		},
		Logger: newLogger,
	})
	sqlDB, _ := global.DB.DB()

	//设置数据库连接池参数
	sqlDB.SetMaxOpenConns(100) //设置数据库连接池最大连接数
	sqlDB.SetMaxIdleConns(20)  //连接池最大允许的空闲连接数，如果没有sql任务需要执行的连接数大于20，超过的连接会被连接池关闭

	if err != nil {
		panic("数据库连接失败")
	}
}

func InitRedisDB() {
	dsn := fmt.Sprintf("%s:%d",
		global.ServerConfig.RedisConfigInfo.Host,
		global.ServerConfig.RedisConfigInfo.Port,
	)
	// 创建一个Redis客户端实例
	global.RedisDB = utils.NewRedisClient(dsn, "", 0)

	// 测试连接
	pong, err := global.RedisDB.Client.Ping(context.Background()).Result()
	if err != nil {
		panic("redis数据库连接失败")
	}
	fmt.Println("Redis connected:", pong)
	global.CollectCache = utils.NewCollectCache(dsn, "", 1)
}
